#ifndef SERVER_THREAD_CLIENTE_H
#define SERVER_THREAD_CLIENTE_H
#include "server_socket.h"
#include "common_thread.h"
#include "common_Mutex.h"
#include "server_Partida.h"
#include "server_Jugador.h"
#include "server_Evento.h"
#include "server_Log.h"
#include <string>

using std::string;

class Server_thread_cliente : public Thread {
private:
    bool* correServer;
    bool correCliente;
    bool agregadoAPartida;
    bool creadorPartida;
    int tiempoActualizacion;
    int numeroCliente;
    string infoCampanias;
    string nombreJugador;
    string nombrePartida;
    Jugador* jugador;
    Partida* partida;
    Mutex* mutex;
    Log log;
    std::vector<Partida*> *listaPartidas;
    std::vector<Partida*> *listaPartidasPendientes;
    std::vector<string> rutasCampanias;
    Server_socket *socket;
    Server_socket *nuevo_socket;
    /* Funcion donde hay un bucle para enviar y recibir informacion del cliente.*/
    void ejecutar();
    bool leerBuffer(string& buffer);
    string agregarLargo(string buffer);
    void setNombreJugadorYPartida(string& buffer);
    void setNombreJugadorYAgregarAPartida(string& buffer);
    string generarInfoPartidas();
    void crearPartidaEnCampania(string& buffer);
    string cantJugadoresEnPartida();

public:
    /* Constructor. */
    Server_thread_cliente(Server_socket* s, Server_socket* nuevo);
    /* Destructor */
    virtual ~Server_thread_cliente();
    void setFlagCorrer(bool* correr);
    void setListaPartidas(std::vector<Partida*>* lista, std::vector<Partida*>* pendientes);
    void setMutexLista(Mutex* mutex);    
    void setTiempoActualizacion(int tiempo);
    void setInfoCampanias(string info);
    void setNumeroCliente(int numero);
    void setRutasCampanias(std::vector<string> rutas);
    void setNombre(string nombre);
};

#endif
